library(tidyverse)
library(Article3Package)
2% outlier and 2 % of sparse missing values
missing.prop <- 0.02
missing.prop.by.loci <- 0.5
We know K
Gaussian data
K <- 6
## data
s <- NormalSampler(n = 100,
L = 1000,
K = K,
prop.outlier = 0.02,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K,
exp.rep = 3)
Hypothesis testing comparison


Logistic data
K <- 3
## data
s <- LogisticSampler(n = 100,
ploidy = 2,
L = 1000,
K = K,
prop.outlier = 0.02,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K,
exp.rep = 3)
Hypothesis testing comparison


We do not know K
Gaussian data
K <- 3
## data
s <- NormalSampler(n = 100,
L = 1000,
K = K,
prop.outlier = 0.02,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K + 1,
exp.rep = 3)
Hypothesis testing comparison


Logistic data
K <- 3
## data
s <- LogisticSampler(n = 100,
ploidy = 2,
L = 1000,
K = K,
prop.outlier = 0.02,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K + 1,
exp.rep = 3)
Hypothesis testing comparison


20% outlier and 2 % of sparse missing values
missing.prop <- 0.02
missing.prop.by.loci <- 0.5
prop.outlier <- 0.2
We know K
Logistic data
K <- 3
## data
s <- LogisticSampler(n = 100,
ploidy = 2,
L = 1000,
K = K,
prop.outlier = prop.outlier,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K,
exp.rep = 3)
Hypothesis testing comparison


Gaussian data
K <- 3
## data
s <- NormalSampler(n = 100,
L = 1000,
K = K,
prop.outlier = prop.outlier,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K,
exp.rep = 3)
Hypothesis testing comparison


20% outlier and 10 % of sparse missing values
missing.prop <- 0.1
missing.prop.by.loci <- 0.5
prop.outlier <- 0.2
We know K
Logistic data
K <- 3
## data
s <- LogisticSampler(n = 100,
ploidy = 2,
L = 1000,
K = K,
prop.outlier = prop.outlier,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K,
exp.rep = 3)
Hypothesis testing comparison


Gaussian data
K <- 3
## data
s <- NormalSampler(n = 100,
L = 1000,
K = K,
prop.outlier = prop.outlier,
sigma = 0.2,
c = 0.6,
mean.B = 0.0,
sd.B = 1.0,
sd.mu = 1.0,
mean.mu = 0.5) %>%
SparseMissingValueSampler(missing.prop = missing.prop,
missing.prop.by.loci = missing.prop.by.loci)
WithMissingValue(s,
method.K = K,
exp.rep = 3)
Hypothesis testing comparison


LS0tCnRpdGxlOiAiTEZNTSB3aXRoIG1pc3NpbmcgdmFsdWUiCmF1dGhvcjogImtldmluIGNheWUiCmRhdGU6ICIxNiBqYW52aWVyIDIwMTciCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgICB0aGVtZTogam91cm5hbAogICAgaGlnaGxpZ2h0OiB0YW5nbwotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEzLCAKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9ICJoaWRlIikKYGBgCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoQXJ0aWNsZTNQYWNrYWdlKQpgYGAKCgojIDIlIG91dGxpZXIgYW5kIDIgJSBvZiB1bmlmb3JtIG1pc3NpbmcgdmFsdWVzCgpgYGB7cn0KbWlzc2luZy5wcm9wIDwtIDAuMDIKYGBgCgoKIyMgV2Uga25vdyBLCgojIyMgR2F1c3NpYW4gZGF0YQoKYGBge3J9CksgPC0gNgojIyBkYXRhCnMgPC0gTm9ybWFsU2FtcGxlcihuID0gMTAwLAogICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgIHByb3Aub3V0bGllciA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICBzaWdtYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgIGMgPSAwLjYsCiAgICAgICAgICAgICAgICAgICBtZWFuLkIgPSAwLjAsCiAgICAgICAgICAgICAgICAgICBzZC5CID0gMS4wLAogICAgICAgICAgICAgICAgICAgc2QubXUgPSAxLjAsCiAgICAgICAgICAgICAgICAgICBtZWFuLm11ID0gMC41KSAlPiUgCiAgTWlzc2luZ1ZhbHVlU2FtcGxlcihtaXNzaW5nLnByb3AgPSBtaXNzaW5nLnByb3ApCgpXaXRoTWlzc2luZ1ZhbHVlKHMsCiAgICAgICAgICAgICAgICAgbWV0aG9kLksgPSBLLAogICAgICAgICAgICAgICAgIGV4cC5yZXAgPSAzKQoKYGBgCgojIyMgTG9naXN0aWMgZGF0YQoKYGBge3J9CksgPC0gMwojIyBkYXRhCnMgPC0gTG9naXN0aWNTYW1wbGVyKG4gPSAxMDAsCiAgICAgICAgICAgICAgICAgICAgIHBsb2lkeSA9IDIsCiAgICAgICAgICAgICAgICAgICAgIEwgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgICAgcHJvcC5vdXRsaWVyID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgIGMgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4uQiA9IDAuMCwKICAgICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgICAgc2QubXUgPSAxLjAsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4ubXUgPSAwLjUpICU+JSAKICBNaXNzaW5nVmFsdWVTYW1wbGVyKG1pc3NpbmcucHJvcCA9IG1pc3NpbmcucHJvcCkKCldpdGhNaXNzaW5nVmFsdWUocywKICAgICAgICAgICAgICAgICBtZXRob2QuSyA9IEssCiAgICAgICAgICAgICAgICAgZXhwLnJlcCA9IDMpCgpgYGAKCgoKIyMgV2UgZG8gbm90IGtub3cgSwoKIyMjIEdhdXNzaWFuIGRhdGEKCmBgYHtyfQpLIDwtIDMKIyMgZGF0YQpzIDwtIE5vcm1hbFNhbXBsZXIobiA9IDEwMCwKICAgICAgICAgICAgICAgICAgIEwgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgSyA9IEssCiAgICAgICAgICAgICAgICAgICBwcm9wLm91dGxpZXIgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICBjID0gMC42LAogICAgICAgICAgICAgICAgICAgbWVhbi5CID0gMC4wLAogICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgIHNkLm11ID0gMS4wLAogICAgICAgICAgICAgICAgICAgbWVhbi5tdSA9IDAuNSkgJT4lIAogIE1pc3NpbmdWYWx1ZVNhbXBsZXIobWlzc2luZy5wcm9wID0gbWlzc2luZy5wcm9wKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSyArIDEsCiAgICAgICAgICAgICAgICAgZXhwLnJlcCA9IDMpCgpgYGAKCiMjIyBMb2dpc3RpYyBkYXRhCgpgYGB7cn0KSyA8LSAzCiMjIGRhdGEKcyA8LSBMb2dpc3RpY1NhbXBsZXIobiA9IDEwMCwKICAgICAgICAgICAgICAgICAgICAgcGxvaWR5ID0gMiwKICAgICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgIEsgPSBLLAogICAgICAgICAgICAgICAgICAgICBwcm9wLm91dGxpZXIgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICBzaWdtYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgYyA9IDAuNiwKICAgICAgICAgICAgICAgICAgICAgbWVhbi5CID0gMC4wLAogICAgICAgICAgICAgICAgICAgICBzZC5CID0gMS4wLAogICAgICAgICAgICAgICAgICAgICBzZC5tdSA9IDEuMCwKICAgICAgICAgICAgICAgICAgICAgbWVhbi5tdSA9IDAuNSkgJT4lIAogIE1pc3NpbmdWYWx1ZVNhbXBsZXIobWlzc2luZy5wcm9wID0gbWlzc2luZy5wcm9wKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSyArIDEsCiAgICAgICAgICAgICAgICAgZXhwLnJlcCA9IDMpCgpgYGAKCgoKCgoKIyAyJSBvdXRsaWVyIGFuZCAyICUgb2Ygc3BhcnNlIG1pc3NpbmcgdmFsdWVzCgpgYGB7cn0KbWlzc2luZy5wcm9wIDwtIDAuMDIKbWlzc2luZy5wcm9wLmJ5LmxvY2kgPC0gMC41CmBgYAoKCiMjIFdlIGtub3cgSwoKIyMjIEdhdXNzaWFuIGRhdGEKCmBgYHtyfQpLIDwtIDYKIyMgZGF0YQpzIDwtIE5vcm1hbFNhbXBsZXIobiA9IDEwMCwKICAgICAgICAgICAgICAgICAgIEwgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgSyA9IEssCiAgICAgICAgICAgICAgICAgICBwcm9wLm91dGxpZXIgPSAwLjAyLAogICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICBjID0gMC42LAogICAgICAgICAgICAgICAgICAgbWVhbi5CID0gMC4wLAogICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgIHNkLm11ID0gMS4wLAogICAgICAgICAgICAgICAgICAgbWVhbi5tdSA9IDAuNSkgJT4lIAogIFNwYXJzZU1pc3NpbmdWYWx1ZVNhbXBsZXIobWlzc2luZy5wcm9wID0gbWlzc2luZy5wcm9wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcucHJvcC5ieS5sb2NpID0gbWlzc2luZy5wcm9wLmJ5LmxvY2kpCgpXaXRoTWlzc2luZ1ZhbHVlKHMsCiAgICAgICAgICAgICAgICAgbWV0aG9kLksgPSBLLAogICAgICAgICAgICAgICAgIGV4cC5yZXAgPSAzKQoKYGBgCgojIyMgTG9naXN0aWMgZGF0YQoKYGBge3J9CksgPC0gMwojIyBkYXRhCnMgPC0gTG9naXN0aWNTYW1wbGVyKG4gPSAxMDAsCiAgICAgICAgICAgICAgICAgICAgIHBsb2lkeSA9IDIsCiAgICAgICAgICAgICAgICAgICAgIEwgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgICAgcHJvcC5vdXRsaWVyID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgIGMgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4uQiA9IDAuMCwKICAgICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgICAgc2QubXUgPSAxLjAsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4ubXUgPSAwLjUpICU+JSAKICBTcGFyc2VNaXNzaW5nVmFsdWVTYW1wbGVyKG1pc3NpbmcucHJvcCA9IG1pc3NpbmcucHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLnByb3AuYnkubG9jaSA9IG1pc3NpbmcucHJvcC5ieS5sb2NpKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSywKICAgICAgICAgICAgICAgICBleHAucmVwID0gMykKCmBgYAoKCgojIyBXZSBkbyBub3Qga25vdyBLCgojIyMgR2F1c3NpYW4gZGF0YQoKYGBge3J9CksgPC0gMwojIyBkYXRhCnMgPC0gTm9ybWFsU2FtcGxlcihuID0gMTAwLAogICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgIHByb3Aub3V0bGllciA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICBzaWdtYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgIGMgPSAwLjYsCiAgICAgICAgICAgICAgICAgICBtZWFuLkIgPSAwLjAsCiAgICAgICAgICAgICAgICAgICBzZC5CID0gMS4wLAogICAgICAgICAgICAgICAgICAgc2QubXUgPSAxLjAsCiAgICAgICAgICAgICAgICAgICBtZWFuLm11ID0gMC41KSAlPiUgCiAgU3BhcnNlTWlzc2luZ1ZhbHVlU2FtcGxlcihtaXNzaW5nLnByb3AgPSBtaXNzaW5nLnByb3AsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wcm9wLmJ5LmxvY2kgPSBtaXNzaW5nLnByb3AuYnkubG9jaSkKCldpdGhNaXNzaW5nVmFsdWUocywKICAgICAgICAgICAgICAgICBtZXRob2QuSyA9IEsgKyAxLAogICAgICAgICAgICAgICAgIGV4cC5yZXAgPSAzKQoKYGBgCgojIyMgTG9naXN0aWMgZGF0YQoKYGBge3J9CksgPC0gMwojIyBkYXRhCnMgPC0gTG9naXN0aWNTYW1wbGVyKG4gPSAxMDAsCiAgICAgICAgICAgICAgICAgICAgIHBsb2lkeSA9IDIsCiAgICAgICAgICAgICAgICAgICAgIEwgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgICAgcHJvcC5vdXRsaWVyID0gMC4wMiwKICAgICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgIGMgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4uQiA9IDAuMCwKICAgICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgICAgc2QubXUgPSAxLjAsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4ubXUgPSAwLjUpICU+JSAKICBTcGFyc2VNaXNzaW5nVmFsdWVTYW1wbGVyKG1pc3NpbmcucHJvcCA9IG1pc3NpbmcucHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLnByb3AuYnkubG9jaSA9IG1pc3NpbmcucHJvcC5ieS5sb2NpKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSyArIDEsCiAgICAgICAgICAgICAgICAgZXhwLnJlcCA9IDMpCgpgYGAKCiMgMjAlIG91dGxpZXIgYW5kIDIgJSBvZiBzcGFyc2UgbWlzc2luZyB2YWx1ZXMKCmBgYHtyfQptaXNzaW5nLnByb3AgPC0gMC4wMgptaXNzaW5nLnByb3AuYnkubG9jaSA8LSAwLjUKcHJvcC5vdXRsaWVyIDwtIDAuMgpgYGAKCiMjIFdlIGtub3cgSwoKIyMjIExvZ2lzdGljIGRhdGEKCmBgYHtyfQpLIDwtIDMKIyMgZGF0YQpzIDwtIExvZ2lzdGljU2FtcGxlcihuID0gMTAwLAogICAgICAgICAgICAgICAgICAgICBwbG9pZHkgPSAyLAogICAgICAgICAgICAgICAgICAgICBMID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgSyA9IEssCiAgICAgICAgICAgICAgICAgICAgIHByb3Aub3V0bGllciA9IHByb3Aub3V0bGllciwKICAgICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgIGMgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4uQiA9IDAuMCwKICAgICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgICAgc2QubXUgPSAxLjAsCiAgICAgICAgICAgICAgICAgICAgIG1lYW4ubXUgPSAwLjUpICU+JSAKICBTcGFyc2VNaXNzaW5nVmFsdWVTYW1wbGVyKG1pc3NpbmcucHJvcCA9IG1pc3NpbmcucHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLnByb3AuYnkubG9jaSA9IG1pc3NpbmcucHJvcC5ieS5sb2NpKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSywKICAgICAgICAgICAgICAgICBleHAucmVwID0gMykKCmBgYAoKCgojIyMgR2F1c3NpYW4gZGF0YQoKYGBge3J9CksgPC0gMwojIyBkYXRhCnMgPC0gTm9ybWFsU2FtcGxlcihuID0gMTAwLAogICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgIHByb3Aub3V0bGllciA9IHByb3Aub3V0bGllciwKICAgICAgICAgICAgICAgICAgIHNpZ21hID0gMC4yLAogICAgICAgICAgICAgICAgICAgYyA9IDAuNiwKICAgICAgICAgICAgICAgICAgIG1lYW4uQiA9IDAuMCwKICAgICAgICAgICAgICAgICAgIHNkLkIgPSAxLjAsCiAgICAgICAgICAgICAgICAgICBzZC5tdSA9IDEuMCwKICAgICAgICAgICAgICAgICAgIG1lYW4ubXUgPSAwLjUpICU+JSAKICBTcGFyc2VNaXNzaW5nVmFsdWVTYW1wbGVyKG1pc3NpbmcucHJvcCA9IG1pc3NpbmcucHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLnByb3AuYnkubG9jaSA9IG1pc3NpbmcucHJvcC5ieS5sb2NpKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSywKICAgICAgICAgICAgICAgICBleHAucmVwID0gMykKCmBgYAoKCgojIDIwJSBvdXRsaWVyIGFuZCAxMCAlIG9mIHNwYXJzZSBtaXNzaW5nIHZhbHVlcwoKYGBge3J9Cm1pc3NpbmcucHJvcCA8LSAwLjEKbWlzc2luZy5wcm9wLmJ5LmxvY2kgPC0gMC41CnByb3Aub3V0bGllciA8LSAwLjIKYGBgCgojIyBXZSBrbm93IEsKCiMjIyBMb2dpc3RpYyBkYXRhCgpgYGB7cn0KSyA8LSAzCiMjIGRhdGEKcyA8LSBMb2dpc3RpY1NhbXBsZXIobiA9IDEwMCwKICAgICAgICAgICAgICAgICAgICAgcGxvaWR5ID0gMiwKICAgICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgIEsgPSBLLAogICAgICAgICAgICAgICAgICAgICBwcm9wLm91dGxpZXIgPSBwcm9wLm91dGxpZXIsCiAgICAgICAgICAgICAgICAgICAgIHNpZ21hID0gMC4yLAogICAgICAgICAgICAgICAgICAgICBjID0gMC42LAogICAgICAgICAgICAgICAgICAgICBtZWFuLkIgPSAwLjAsCiAgICAgICAgICAgICAgICAgICAgIHNkLkIgPSAxLjAsCiAgICAgICAgICAgICAgICAgICAgIHNkLm11ID0gMS4wLAogICAgICAgICAgICAgICAgICAgICBtZWFuLm11ID0gMC41KSAlPiUgCiAgU3BhcnNlTWlzc2luZ1ZhbHVlU2FtcGxlcihtaXNzaW5nLnByb3AgPSBtaXNzaW5nLnByb3AsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5wcm9wLmJ5LmxvY2kgPSBtaXNzaW5nLnByb3AuYnkubG9jaSkKCldpdGhNaXNzaW5nVmFsdWUocywKICAgICAgICAgICAgICAgICBtZXRob2QuSyA9IEssCiAgICAgICAgICAgICAgICAgZXhwLnJlcCA9IDMpCgpgYGAKCgojIyMgR2F1c3NpYW4gZGF0YQoKYGBge3J9CksgPC0gMwojIyBkYXRhCnMgPC0gTm9ybWFsU2FtcGxlcihuID0gMTAwLAogICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICBLID0gSywKICAgICAgICAgICAgICAgICAgIHByb3Aub3V0bGllciA9IHByb3Aub3V0bGllciwKICAgICAgICAgICAgICAgICAgIHNpZ21hID0gMC4yLAogICAgICAgICAgICAgICAgICAgYyA9IDAuNiwKICAgICAgICAgICAgICAgICAgIG1lYW4uQiA9IDAuMCwKICAgICAgICAgICAgICAgICAgIHNkLkIgPSAxLjAsCiAgICAgICAgICAgICAgICAgICBzZC5tdSA9IDEuMCwKICAgICAgICAgICAgICAgICAgIG1lYW4ubXUgPSAwLjUpICU+JSAKICBTcGFyc2VNaXNzaW5nVmFsdWVTYW1wbGVyKG1pc3NpbmcucHJvcCA9IG1pc3NpbmcucHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLnByb3AuYnkubG9jaSA9IG1pc3NpbmcucHJvcC5ieS5sb2NpKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSywKICAgICAgICAgICAgICAgICBleHAucmVwID0gMykKCmBgYAoKCiMgMjAlIG91dGxpZXIgYW5kIDIwICUgb2YgdW5pZm9ybSBtaXNzaW5nIHZhbHVlcwoKYGBge3J9Cm1pc3NpbmcucHJvcCA8LSAwLjIwCnByb3Aub3V0bGllciA8LSAwLjIKYGBgCgojIyBXZSBrbm93IEsKCiMjIyBHYXVzc2lhbiBkYXRhCgpgYGB7cn0KSyA8LSAzCiMjIGRhdGEKcyA8LSBOb3JtYWxTYW1wbGVyKG4gPSAxMDAsCiAgICAgICAgICAgICAgICAgICBMID0gMTAwMCwKICAgICAgICAgICAgICAgICAgIEsgPSBLLAogICAgICAgICAgICAgICAgICAgcHJvcC5vdXRsaWVyID0gcHJvcC5vdXRsaWVyLAogICAgICAgICAgICAgICAgICAgc2lnbWEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICBjID0gMC42LAogICAgICAgICAgICAgICAgICAgbWVhbi5CID0gMC4wLAogICAgICAgICAgICAgICAgICAgc2QuQiA9IDEuMCwKICAgICAgICAgICAgICAgICAgIHNkLm11ID0gMS4wLAogICAgICAgICAgICAgICAgICAgbWVhbi5tdSA9IDAuNSkgJT4lIAogIE1pc3NpbmdWYWx1ZVNhbXBsZXIobWlzc2luZy5wcm9wID0gbWlzc2luZy5wcm9wKQoKV2l0aE1pc3NpbmdWYWx1ZShzLAogICAgICAgICAgICAgICAgIG1ldGhvZC5LID0gSywKICAgICAgICAgICAgICAgICBleHAucmVwID0gMykKCmBgYAoKCiMjIyBMb2dpc3RpYyBkYXRhCgpgYGB7cn0KSyA8LSAzCiMjIGRhdGEKcyA8LSBMb2dpc3RpY1NhbXBsZXIobiA9IDEwMCwKICAgICAgICAgICAgICAgICAgICAgcGxvaWR5ID0gMiwKICAgICAgICAgICAgICAgICAgICAgTCA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgIEsgPSBLLAogICAgICAgICAgICAgICAgICAgICBwcm9wLm91dGxpZXIgPSBwcm9wLm91dGxpZXIsCiAgICAgICAgICAgICAgICAgICAgIHNpZ21hID0gMC4yLAogICAgICAgICAgICAgICAgICAgICBjID0gMC42LAogICAgICAgICAgICAgICAgICAgICBtZWFuLkIgPSAwLjAsCiAgICAgICAgICAgICAgICAgICAgIHNkLkIgPSAxLjAsCiAgICAgICAgICAgICAgICAgICAgIHNkLm11ID0gMS4wLAogICAgICAgICAgICAgICAgICAgICBtZWFuLm11ID0gMC41KSAlPiUgCiAgTWlzc2luZ1ZhbHVlU2FtcGxlcihtaXNzaW5nLnByb3AgPSBtaXNzaW5nLnByb3ApCgpXaXRoTWlzc2luZ1ZhbHVlKHMsCiAgICAgICAgICAgICAgICAgbWV0aG9kLksgPSBLLAogICAgICAgICAgICAgICAgIGV4cC5yZXAgPSAzKQoKYGBgCgo=